package com.wuad.platformwuad.module.study.webMethodParams;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

/**
 * 接口请求方式
 *
 * @author wuaodi
 */
@Slf4j
@RestController
@RequestMapping("/controller")
public class RequestMethodController {

    /**
     * 一：.@Controller 与 @RestController：
     * 都是标识该类是否可以处理HTTP请求，可以认为@RestController是@Controller和@ResponseBody的结合体，是这两个注解合并效果。
     * @RestController和@Controller都是用来表示Spring某个类是否可以接受HTTP请求。
     *
     * 虽然二者的用法基本类似，但还是有一些区别如下：
     * 1.@Controller标识当前类是SpringMVC Controller处理器，而@RestController则只负责数据返回。
     * 2.使用@RestController注解，则Controller中的方法无法返回Web页面，配置的视图解析器InternalResourceViewResolver不起作用，返回的内容就是Return中的数据。
     * 3.如果需要返回指定页面，则使用@Controller注解，并配合视图解析器返回页面和数据。如果需要返回JSON、XML或自定义内容到页面，则需要在对应的方法上加上@ResponseBody注解。
     * 4.使用@Controller注解时，在对应的方法上，视图解析器可以解析返回的JSP、HTML页面，并且跳转到相应页面。若返回JSON等内容到页面，则需要添加@ResponseBody注解。
     * 5.@RestController注解相当于@Controller和@ResponseBody两个注解的结合，能直接将返回的数据转换成JSON数据格式，无须在方法前添加@ResponseBody注解，
     * 但使用@RestController注解时不能返回JSP、HTML页面，视图解析器无法解析JSP、HTML页面。
     * 总结：在Web系统中使用@Controller较多，而在Web API中基本使用@RestController注解。
     *
     * 二.方法上的@RequestMapping 与 类上的@RequestMapping
     * 用于类上，表示类中的所有响应请求的方法都是以该地址作为父路径。
     * 用于方法上，表示在类的父路径下追加方法上注解中的地址将会访问到该方法
     *
     * 三.@Autowired 与 @Resource
     *
     *
     *
     *
     *
     *
     */


    /**
     * 只有@RequestMapping，没有设置value属性值
     *
     * @return
     */
    @RequestMapping
    public String RequestMappingTest1() {
        return "只有标签，没有value属性也能访问到";
    }

    /**
     *  设置value属性值
     *
     * @return
     */
    @RequestMapping(value = "/RequestMappingTest2_1")
    public String RequestMappingTest2_1() {
        return "设置了value属性值";
    }

    /**
     *  设置value属性值
     *
     * @return
     */
    @RequestMapping("/RequestMappingTest2_2")
    public String RequestMappingTest2_2() {
        return "不同方式设置的value属性值";
    }

    /**
     *  value属性值设置多个
     *
     * @return
     */
    @RequestMapping(value = {"/RequestMappingTest2_3","/RequestMappingTest2_4"})
    public String RequestMappingTest2_3() {
        return "给value属性设置多个值";
    }

    /**
     *  设置method属性值为get
     *  浏览器向服务器发送请求，请求方式有很多GET、HEAD、POST、PUT、PATCH、DELETE、OPTIONS、TRACE。可以使用 method 属性来约束请求方式。
     *
     * @return
     */
    @RequestMapping(value = "/RequestMappingTest3_1", method = RequestMethod.GET)
    public String RequestMappingTest2_5() {
        return "设置method属性值，接口为get请求";
    }

    /**
     *  设置method属性值为post
     *
     * @return
     */
    @RequestMapping(value = "/RequestMappingTest3_2", method = RequestMethod.POST)
    public String RequestMappingTest2_6() {
        return "设置method属性值，接口为post请求";
    }

    /**
     *  设置method属性值,能设置为同时满足post请求和get请求
     *
     * @return
     */
    @RequestMapping(value = "/RequestMappingTest3_3", method = {RequestMethod.POST, RequestMethod.GET})
    public String RequestMappingTest2_7() {
        return "设置method属性值，接口为post请求";
    }

    /**
     *  设置params属性
     *  “param”：要求请求映射的请求必须为包含 param的请求参数
     * “!param”：要求请求映射的请求是不能包含param的请求参数
     * “param=value”：要求请求映射的请求必须包含 param 的请求参数，且 param 参数的值必须为 value
     * “param!=value”： 要求请求映射的请求是必须包含 param 的请求参数，其值不能为 value。
     *
     * @return
     */
    @RequestMapping(value = "/RequestMappingTest4_1", params = {"username","password"})
    public String RequestMappingTest2_8() {
        return "设置params属性，接口请求必须包含username";
    }

    /**
     *  设置params属性
     *
     * @return
     */
    @RequestMapping(value = "/RequestMappingTest4_2", params = {"username","password"})
    public String RequestMappingTest2_9() {
        return "设置params属性，接口请求必须包含username和password两个值";
    }

    /**
     *  设置headers属性
     *  “header”：要求请求映射的请求必须为包含 header的请求头信息
     * “!header”：要求请求映射的请求必须为不包含 header的请求头信息
     * “header=value”：要求请求映射的请求必须为包含 header的请求头信息，并且header的值必须为value
     * “header!=value”：要求请求映射的请求必须为包含 header的请求头信息，并且header的值必须不是value
     *
     * @return
     */
    @RequestMapping(value = "/RequestMappingTest5_1", headers = "Host = localhost:9999")
    public String RequestMappingTest2_10() {
        return "设置headers属性";
    }

    /**
     * 问题1：可是原来的@RequestMapping如果不加method不是什么类型的都能接受吗？那为什么还需要新的这些注释？
     * 答： 如果想要用@RequestMapping来实现resful风格，就得写@RequestMapping(value = “/user”, method = RequestMethod.GET)，
     * 是不是很麻烦，所以就有了@getMapping，
     * 同一个controller下@getMapping（“/user”）和@postMapping（“/user”），我们不用多起一级名字，而是采用请求方式来区分
     *
     * 问题2：标签里的value写不写的有区别吗
     */

    /**
     *
     * @GetMapping = @RequestMapping(value = “”, method = RequestMethod.GET)
     *
     * @PostMapping = @RequestMapping(value = “”, method = RequestMethod.POST)
     *
     * @DeleteMapping = @RequestMapping(value = “”, method = RequestMethod.DELETE)
     *
     * @PutMapping = @RequestMapping(value = “”, method = RequestMethod.PUT)
     *
     * @return
     */
    @GetMapping(value = "/testPath1")
    public String getMapping1() {
        return "这是get请求";
    }

    @GetMapping("/testPath2")
    public String getMapping2() {
        return "这是get请求";
    }

    @PostMapping("/testPath2")
    public String postMapping2() {
        return "这是post请求,但路径与上面的接口是一样的，同样的路径，使用不同的请求方式是可以正常访问的";
    }

}
